package cn.gson.crmdemo.model.service;


import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSONArray;

import cn.gson.crmdemo.model.dao.DeptDao;
import cn.gson.crmdemo.model.dao.EmpDao;
import cn.gson.crmdemo.model.dao.FunctionDao;
import cn.gson.crmdemo.model.dao.JournalDao;
import cn.gson.crmdemo.model.dao.NoticeDao;
import cn.gson.crmdemo.model.dao.RoleDao;
import cn.gson.crmdemo.model.mapper.DeptMapper;
import cn.gson.crmdemo.model.mapper.EmpMapper;
import cn.gson.crmdemo.model.mapper.MenuMapper;
import cn.gson.crmdemo.model.mapper.NoticeMapper;
import cn.gson.crmdemo.model.mapper.RoleMapper;
import cn.gson.crmdemo.model.pojo.Dept;
import cn.gson.crmdemo.model.pojo.Emp;
import cn.gson.crmdemo.model.pojo.Function;
import cn.gson.crmdemo.model.pojo.FunctionType;
import cn.gson.crmdemo.model.pojo.Journal;
import cn.gson.crmdemo.model.pojo.Notice;
import cn.gson.crmdemo.model.pojo.Role;
import cn.gson.crmdemo.model.vo.DeptVo;
import cn.gson.crmdemo.model.vo.EmpDeptVo;
import cn.gson.crmdemo.model.vo.EmpVo;
import cn.gson.crmdemo.model.vo.FunctionFunTypeVo;
import cn.gson.crmdemo.model.vo.FunctionVo;
import cn.gson.crmdemo.model.vo.RoleEmpVo;

@Service
@Transactional(rollbackFor=Exception.class)
public class PrivilegeService {
	@Autowired
	EmpDao edao;
	@Autowired
	DeptDao ddao;
	@Autowired
	RoleDao rdao;
	@Autowired
	FunctionDao fdao;
	@Autowired
	NoticeDao ndao;
	@Autowired
	JournalDao  jdao;
	@Autowired
	EmpMapper emapper;
	@Autowired
	DeptMapper dmapper;
	@Autowired
	RoleMapper rmapper;
	@Autowired
	NoticeMapper nmapper;
	@Autowired
	MenuMapper mmapper;
	/**
	 * 查询所有员工
	 * @return
	 */
	public JSONArray selectEmp(Integer empId,String empName,Integer deptId) {
		return emapper.selectEmp(empId,empName,deptId);
	}
	/**
	 * 新增员工
	 */
	public boolean addEmp(Emp emp) {
		List<Integer> list = emapper.selectEmpIsNull(emp.getEmpRoot());
		if(list.size()>0) {
			return false;
		}
		else {
			emp.setEmpDate(new Date());
			emp.setEmpSar(new BigDecimal(1000));
			edao.save(emp);
			return true;
		}
	}
	/**
	 * 修改员工信息
	 */
	public void updateEmp(EmpVo emp) {
		if(emp.getDeptId() == null && emp.getEmpsId() != null) {
			Emp emps = edao.findById(emp.getEmpId()).get();
			Emp empes = edao.findById(emp.getEmpsId()).get();
			emps.setEmpName(emp.getEmpName());
			emps.setEmpRoot(emp.getEmpRoot());
			emps.setEmpPass(emp.getEmpPass());
			emps.setEmpSar(emp.getEmpSar());
			emps.setEmpSex(emp.getEmpSex());
			emps.setEmpBirthday(emp.getEmpBirthday());
			emps.setEmp(empes);
		}
		else if(emp.getEmpsId() == null && emp.getDeptId() != null){
			Emp emps = edao.findById(emp.getEmpId()).get();
			Dept dept = ddao.findById(emp.getDeptId()).get();
			emps.setEmpName(emp.getEmpName());
			emps.setEmpRoot(emp.getEmpRoot());
			emps.setEmpPass(emp.getEmpPass());
			emps.setEmpSar(emp.getEmpSar());
			emps.setEmpSex(emp.getEmpSex());
			emps.setEmpBirthday(emp.getEmpBirthday());
			emps.setDept(dept);
		}
		else if(emp.getDeptId() == null && emp.getEmpsId() == null){
			Emp emps = edao.findById(emp.getEmpId()).get();
			emps.setEmpName(emp.getEmpName());
			emps.setEmpRoot(emp.getEmpRoot());
			emps.setEmpPass(emp.getEmpPass());
			emps.setEmpSar(emp.getEmpSar());
			emps.setEmpSex(emp.getEmpSex());
			emps.setEmpBirthday(emp.getEmpBirthday());
		}
		else {
			Emp emps = edao.findById(emp.getEmpId()).get();
			Dept dept = ddao.findById(emp.getDeptId()).get();
			Emp empes = edao.findById(emp.getEmpsId()).get();
			emps.setEmpName(emp.getEmpName());
			emps.setEmpRoot(emp.getEmpRoot());
			emps.setEmpPass(emp.getEmpPass());
			emps.setEmpSar(emp.getEmpSar());
			emps.setEmpSex(emp.getEmpSex());
			emps.setEmpBirthday(emp.getEmpBirthday());
			emps.setDept(dept);
			emps.setEmp(empes);
		}
	}
	/**
	 * 查询所有部门
	 * @return
	 */
	public JSONArray selectDeptAll() {
		return dmapper.selectDept();
	}
	/**
	 * 重置员工密码
	 */
	public void resets(Integer empId) {
		Emp emp = edao.findById(empId).get();
		emp.setEmpPass("123456");
	}
	/**
	 * 查询员工上级
	 */
	public JSONArray selectEmpSj(Integer empId) {
		return emapper.selectEmpSj(empId);
	}
	/**
	 * 查询所有部门树状图
	 * @return
	 */
	public List<Dept> selectAllDept(){
		return dmapper.selectAllDept();
	}
	/**
	 * 查询部门详情
	 */
	public Map<String, Object> selectDeptXq(Integer deptId) {
		JSONArray list = dmapper.selectDeptSjZs(deptId);
		Map<String, Object> map = new HashMap<>();
		map.put("manager", dmapper.selectDeptJl(deptId));
		map.put("assistant", dmapper.selectDeptZs(deptId));
		map.put("superior", dmapper.selectAllDeptSj(deptId));
		if(list.get(0)==null) {
			map.put("jlzs", "111");
		}
		else {
			map.put("jlzs", list);
		}
		return map;
	}
	/**
	 * 查询部门经理和助手编号
	 */
	/*public JSONArray selectDeptSjZs(Integer deptId) {
		return dmapper.selectDeptSjZs(deptId);
	}*/
	/**
	 * 查询所有角色
	 * @return
	 */
	public JSONArray selectRoleAll(String roleName) {
		return rmapper.selectRoleAll(roleName);
	}
	public JSONArray selectRoleAlls() {
		return rmapper.selectRoleAlls();
	}
	/**
	 * 给员工授权
	 */
	public void addRole(List<RoleEmpVo> role) {
		System.err.println("rolesize："+role.size());
		Emp emp = edao.findById(role.get(0).getEmpId()).get();
		emp.getRoles().clear();
		for(int i=0;i<role.size();i++) {
			System.err.println("empId："+role.get(i).getEmpId());
			System.err.println("roleId："+role.get(i).getRoleId());
			Role role2 = rdao.findById(role.get(i).getRoleId()).get();
			emp.getRoles().add(role2);
		}
	}
	/**
	 * 查询员工所有角色
	 * @return
	 */
	public List<Integer> selectRoleEmp(Integer empId) {
		return emapper.selectRoleEmp(empId);
	}
	/**
	 * 员工离职
	 */
	public boolean empQuit(Integer empId) {
		List<Integer> list = emapper.selectEmpJsorZs(empId);
		if(list.size()>0) {
			return false;
		}
		else {
			List<Integer> list2 = emapper.selectEmpXjId(empId);
			if(list2.size()>0) {
				Emp emp = edao.findById(empId).get();
				emp.setEmpType(1);
				emp.getRoles().clear();
				emp.setDept(null);
				for(int i=0;i<list2.size();i++) {
					Emp emp2 = edao.findById(list2.get(i)).get();
					emp2.setEmp(null);
				}
			}
			else {
				Emp emp = edao.findById(empId).get();
				emp.setEmpType(1);
				emp.getRoles().clear();
				emp.setDept(null);
			}
			return true;
		}
	}
	/**
	 * 新增角色
	 */
	public void addRoles(Role role) {
		rdao.save(role);
	}
	/**
	 * 编辑角色
	 */
	public void updateRoles(Role roles) {
		rdao.save(roles);
	}
	/**
	 * 查询所有未分配部门的员工
	 * @return
	 */
	public JSONArray selectEmpNullDept() {
		return emapper.selectEmpNullDept();
	}
	/**
	 * 查询功能
	 * @return
	 */
	public List<FunctionVo> selectFunction(){
		return rmapper.selectFunction();
	}
	/**
	 * 给角色授权功能
	 * @param functions
	 */
	public void addFunction(List<FunctionFunTypeVo> functions) {
		Role role = rdao.findById(functions.get(0).getRoleId()).get();
		role.getFunctions().clear();
		for(int i=0;i<functions.size();i++) {
			Function function = fdao.findById(functions.get(i).getFunctionId()).get();
			role.getFunctions().add(function);
		}
	}
	/**
	 * 查询某个角色所有功能编号
	 * @param roleId
	 * @return
	 */
	public List<Integer> selectFunctionId(Integer roleId){
		return rmapper.selectFunctionId(roleId);
	}
	/**
	 * 删除角色
	 * @param roleId
	 */
	public void deleteRole(Integer roleId) {
		Role role = rdao.findById(roleId).get();
		role.getFunctions().clear();
		List<Integer> list = rmapper.selecEmpRole(roleId);
		for(int i=0;i<list.size();i++) {
			Emp emp = edao.findById(list.get(i)).get();
			emp.getRoles().remove(i);
		}
		rdao.deleteById(roleId);
	}
	/**
	 * 新增部门
	 */
	public boolean addDept(DeptVo dept) {
		List<Integer> list = dmapper.selectDeptIsNull(dept.getDeptName());
		if(list.size()>0) {
			return false;
		}
		else {
			Dept depts = new Dept();
			if(dept.getDeptId()==null) {
				depts.setDeptDate(new Date());
				depts.setDeptName(dept.getDeptName());
				ddao.save(depts);
			}
			else {
				Dept dept2 = ddao.findById(dept.getDeptId()).get();
				depts.setDeptDate(new Date());
				depts.setDeptName(dept.getDeptName());
				depts.setDept(dept2);
				ddao.save(depts);
			}
			return true;
		}
	}
	/**
	 * 给员工分配部门
	 */
	public void addEmpDept(List<EmpDeptVo> edvo) {
		Dept dept = ddao.findById(edvo.get(0).getDeptId()).get();
		for(int i=0;i<edvo.size();i++) {
			Emp emp = edao.findById(edvo.get(i).getEmpId()).get();
			emp.setDept(dept);
		}
	}
	/**
	 * 设置部门经理
	 */
	public void deptJl(Integer deptId,Integer empId) {
		Emp emp = edao.findById(empId).get();
		Dept dept = ddao.findById(deptId).get();
		dept.setEmp1(emp);
	}
	/**
	 * 设置部门助手
	 */
	public void deptZs(Integer deptId,Integer empId) {
		Emp emp = edao.findById(empId).get();
		Dept dept = ddao.findById(deptId).get();
		dept.setEmp2(emp);
	}
	/**
	 * 删除部门
	 */
	public boolean deleteDept(Integer deptId) {
		List<Integer> list1 = dmapper.selectDeptEmp(deptId);
		List<Integer> list2 = dmapper.selectDeptXj(deptId);
		if(list1.size()>0 || list2.size()>0) {
			return false;
		}
		else {
			ddao.deleteById(deptId);
			return true;
		}
	}
	/**
	 * 发布通知
	 */
	public void addNotice(Notice notice) {
		notice.setNoticeDate(new Date());
		ndao.save(notice);
	}
	/**
	 * 查询重要通知
	 */
	public JSONArray selectNoticeAll0() {
		return nmapper.selecNoticeAll0();
	}
	/**
	 * 查询通知
	 */
	public JSONArray selectNoticeAll1() {
		return nmapper.selecNoticeAll1();
	}
	/**
	 * 查询业界动态
	 */
	public JSONArray selectNoticeAll2() {
		return nmapper.selecNoticeAll2();
	}
	/**
	 * 查询其他 
	 */
	public JSONArray selectNoticeAll3() {
		return nmapper.selecNoticeAll3();
	}
	/**
	 * 查询所有通知
	 */
	public JSONArray selectNoticeAll(String objects,Integer selectType) {
		if(selectType == 1) {
			if(objects.equals("重要通知")) {
				objects = "0";
			}
			else if(objects.equals("通知")) {
				objects = "1";
			}
			else if(objects.equals("业界动态")) {
				objects = "2";
			}
			else if(objects.equals("其他")) {
				objects = "3";
			}
			else {
				objects = "";
			}
		}
		return nmapper.selectNoticeAll(objects,selectType);
	}
	/**
	 * 删除通知
	 * @param noticeId
	 */
	public void deleteNotice(Integer noticeId) {
		ndao.deleteById(noticeId);
	}
	/**
	 * 查询一级功能
	 * @return
	 */
	public List<FunctionType> selectFuntypeAll(Integer empId) {
		return mmapper.selectFuntionAll(empId);
	}
	/**
	 * 根据编号查询通知
	 */
	public JSONArray selectNotices(Integer noticeId) {
		return nmapper.selectNotices(noticeId);
	}
	/**
	 * 修改密码
	 */
	public boolean updateEmpPass(String pass1,String pass2,Integer empId) {
		if(pass1.equals(pass2)) {
			Emp emp = edao.findById(empId).get();
			emp.setEmpPass(pass1);
			return true;
		}
		return false;
	}
	/**
	 * 修改个人信息
	 */
	public void updateEmpInfo(Emp emp,Integer empId) {
		Emp emp2 = edao.findById(empId).get();
		emp2.setEmpName(emp.getEmpName());
		emp2.setEmpSex(emp.getEmpSex());
		emp2.setEmpBirthday(emp.getEmpBirthday());
	}
	/**
	 * 查询某员工的信息
	 * @return
	 */
	public JSONArray selectEmpInfo(Integer empId) {
		return emapper.selectEmpInfo(empId);
	}
	/**
	 * 查询某角色按三级权限
	 * @param empId
	 * @param employeeId
	 * @return
	 */
	public List<Integer> selectFuntionEmployee(Integer empId,Integer employeeId){
		return mmapper.selectFuntionEmployee(empId, employeeId);
	}
	/**
	 * 查询某员工最近十篇日志
	 */
	public JSONArray selectJournal(Integer empId) {
		return mmapper.selectJournal(empId);
	}
	/**
	 * 新增日志
	 */
	public void addJournal(String content,Integer empId) {
		Journal j = new Journal();
		Emp emp = edao.findById(empId).get();
		j.setEmpId(emp);
		j.setJournalDate(new Date());
		j.setJournalText(content);
		jdao.save(j);
	}
	/**
	 * 查询当前登陆人的最大角色等级
	 */
	public Integer selectEmpGrade(Integer empId) {
		return emapper.selectEmpGrade(empId);
	}
}
